{"componentChunkName":"component---src-templates-blog-post-js","path":"/Easy-Customizable-Star-Rating-Component-in-React/","result":{"data":{"site":{"siteMetadata":{"title":"Aleks Popovic - personal website and blog"}},"markdownRemark":{"id":"d62470b1-9fd0-5155-9e08-e304d3868e7f","excerpt":"In this tutorial you will learn how to set up a simple, yet pretty customizable star rating component in React. You know those little stars that you use to rate…","html":"<p>In this tutorial you will learn how to set up a simple, yet pretty customizable star rating component in React. You know those little stars that you use to rate stuff all over the internet? We will build those as a default use-case, but we will also add support for other text-based and emoji-based icons that you can use instead of little yellow stars.</p>\n<p>If you would prefer a video version of this tutorial you can watch me build this component in React on Youtube:</p>\n<div class=\"gatsby-resp-iframe-wrapper\" style=\"padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem\" > <iframe src=\"https://www.youtube.com/embed/J-gURMj3M6A\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen style=\" position: absolute; top: 0; left: 0; width: 100%; height: 100%; \"></iframe> </div>\n<p>I started a new React app through <a href=\"https://vitejs.dev/\" target=\"_blank\" rel=\"noreferrer\">Vite</a> by running:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">yarn</span> create vite</code></pre></div>\n<p>If you don’t use yarn you can find detailed scaffolding instructions on <a href=\"https://vitejs.dev/guide/#scaffolding-your-first-vite-project\" target=\"_blank\" rel=\"noreferrer\">Vite’s Getting Started page</a>.</p>\n<p>For this component we won’t use any additional libraries, so we can jump straight into it.</p>\n<p>I created a file for my component and I called it <code class=\"language-text\">Stars.jsx</code>. I also created a separate styles file which I called <code class=\"language-text\">Stars.css</code>. Since this is a simple mini project I’ve left them in the <code class=\"language-text\">/src/</code> folder, so if you are plugging these into your existing project you will have to make some adjustments.</p>\n<p>I started off by adding some simple CSS to my <code class=\"language-text\">App.css</code> file, which I used to set up the page background color and to center stuff on screen. If you plan to add this component to an existing project you can skip this step.</p>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">//App.css</span>\n\n<span class=\"token selector\">body </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rgb</span><span class=\"token punctuation\">(</span>39<span class=\"token punctuation\">,</span> 39<span class=\"token punctuation\">,</span> 39<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">#root </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 1280px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0 auto<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">text-align</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 100vh<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">justify-content</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We will initialize the <code class=\"language-text\">Stars.jsx</code> component and add some default properties and props to it.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token string\">\"./Stars.css\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_COUNT</span> <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_ICON</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"★\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_UNSELECTED_COLOR</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"grey\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_COLOR</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"yellow\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Stars</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> count<span class=\"token punctuation\">,</span> defaultRating<span class=\"token punctuation\">,</span> icon<span class=\"token punctuation\">,</span> color<span class=\"token punctuation\">,</span> iconSize <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>starsContainer<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The idea here is that we want our use-case to be the 5/5 yellow star rating component, so we need to set up our default properties to reflect that. We will continue with setting up our state and mapping out an appropriate number of stars.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token string\">\"./Stars.css\"</span><span class=\"token punctuation\">;</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_COUNT</span> <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_ICON</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"★\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_UNSELECTED_COLOR</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"grey\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_COLOR</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"yellow\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Stars</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> count<span class=\"token punctuation\">,</span> defaultRating<span class=\"token punctuation\">,</span> icon<span class=\"token punctuation\">,</span> color<span class=\"token punctuation\">,</span> iconSize <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>rating<span class=\"token punctuation\">,</span> setRating<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span>defaultRating<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>temporaryRating<span class=\"token punctuation\">,</span> setTemporaryRating<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\"></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">let</span> stars <span class=\"token operator\">=</span> <span class=\"token function\">Array</span><span class=\"token punctuation\">(</span>count <span class=\"token operator\">||</span> <span class=\"token constant\">DEFAULT_COUNT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">fill</span><span class=\"token punctuation\">(</span>icon <span class=\"token operator\">||</span> <span class=\"token constant\">DEFAULT_ICON</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>starsContainer<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">      </span><span class=\"token punctuation\">{</span>stars<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span></span><span class=\"gatsby-highlight-code-line\">          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>star<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">key</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>index<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">            </span><span class=\"token punctuation\">{</span>icon <span class=\"token operator\">?</span> icon <span class=\"token operator\">:</span> <span class=\"token constant\">DEFAULT_ICON</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\"></span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We will use <code class=\"language-text\">temporaryRating</code> as a helper property to visually display which rating will be set once we click on a star, and we will track that final rating in the <code class=\"language-text\">rating</code> property.</p>\n<p>We are setting up an array which has the number of elements that we need and we are mapping through it to create new elements which contain our stars, or a different icon that we’ve set. Now would be an appropriate time to quickly jump into our <code class=\"language-text\">Stars.css</code> file and add some very light CSS which will fix our stars not being properly positioned.</p>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token selector\">.starsContainer </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.star </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">cursor</span><span class=\"token punctuation\">:</span> pointer<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">transition</span><span class=\"token punctuation\">:</span> all 0.1s linear<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.star:hover </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">scale</span><span class=\"token punctuation\">(</span>1.1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>I told you it’s going to be light. We are just adding flex to our container to make the stars fit in a single row by default. We are also adding a slight transition effect on hover where we are bumping the icon size a bit when me mouse over it. </p>\n<p>We can now go back to the component. Our next order of business is to determine when and how to change our icon color from grey to yellow (or any other color that you’ve set up through props).</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// .starsContainer in Stars.jsx</span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>starsContainer<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">  </span><span class=\"token punctuation\">{</span>stars<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">const</span> isActiveColor <span class=\"token operator\">=</span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token punctuation\">(</span>rating <span class=\"token operator\">||</span> temporaryRating<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token punctuation\">(</span>index <span class=\"token operator\">&lt;</span> rating <span class=\"token operator\">||</span> index <span class=\"token operator\">&lt;</span> temporaryRating<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\"></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">let</span> elementColor <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\"></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isActiveColor<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">      elementColor <span class=\"token operator\">=</span> color <span class=\"token operator\">||</span> <span class=\"token constant\">DEFAULT_COLOR</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">      elementColor <span class=\"token operator\">=</span> <span class=\"token constant\">DEFAULT_UNSELECTED_COLOR</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token punctuation\">}</span></span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>star<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">key</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>index<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">        </span><span class=\"token punctuation\">{</span>icon <span class=\"token operator\">?</span> icon <span class=\"token operator\">:</span> <span class=\"token constant\">DEFAULT_ICON</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>We will use <code class=\"language-text\">isActiveColor</code> as a helper property to figure out when should the icon have the “active” color. There are two main parts to it.</p>\n<p>The first one says we need to have a <code class=\"language-text\">rating</code> or a <code class=\"language-text\">temporary</code> rating. If we don’t have any rating set up then there is no need to change the color of any icon. The <code class=\"language-text\">rating</code> covers the use-case of loading the component which already has its state set up, and the <code class=\"language-text\">temporaryRating</code> covers the use-case of using our mouse to hover the component and preview the rating which we want to set.</p>\n<p>The second part compares our current icon’s index to <code class=\"language-text\">rating</code> and <code class=\"language-text\">temporaryRating</code>. Since array index in <code class=\"language-text\">JavaScript</code> starts from 0 we need to make sure the index has a strictly smaller value then our two ratings. For example, if our rating is 1/5 we need to color just the first star, which has the index of 0, which is smaller than 1.</p>\n<p>Now that we know when the icon should have the “active” color we can use <code class=\"language-text\">elementColor</code> as a helper property to set the appropriate color. If we’ve passed in the <code class=\"language-text\">color</code> prop we will use that, otherwise we will use the <code class=\"language-text\">DEFAULT_COLOR</code>. If “active” color does not need to be set then we use the <code class=\"language-text\">DEFAULT_UNSELECTED_COLOR</code>. We can now proceed with actually using these properties to change the look of our icons.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// return statement in Stars.jsx</span>\n\n<span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n  <span class=\"token operator\">&lt;</span>div\n    className<span class=\"token operator\">=</span><span class=\"token string\">\"star\"</span>\n    key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>index<span class=\"token punctuation\">}</span>\n<span class=\"gatsby-highlight-code-line\">    style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">      fontSize<span class=\"token operator\">:</span> iconSize <span class=\"token operator\">?</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>iconSize<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">px</span><span class=\"token template-punctuation string\">`</span></span> <span class=\"token operator\">:</span> <span class=\"token string\">\"14px\"</span><span class=\"token punctuation\">,</span></span><span class=\"gatsby-highlight-code-line\">      color<span class=\"token operator\">:</span> elementColor<span class=\"token punctuation\">,</span></span><span class=\"gatsby-highlight-code-line\">      filter<span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>isActiveColor <span class=\"token operator\">?</span> <span class=\"token string\">\"grayscale(0%)\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"grayscale(100%)\"</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span>  <span class=\"token operator\">></span>\n    <span class=\"token punctuation\">{</span>icon <span class=\"token operator\">?</span> icon <span class=\"token operator\">:</span> <span class=\"token constant\">DEFAULT_ICON</span><span class=\"token punctuation\">}</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Remember we want to cover both the text based icons such as <code class=\"language-text\">★ or ❤</code>, but also emoji based icons such as <code class=\"language-text\">🌷 or 😍</code>. To do this we can add the <code class=\"language-text\">style</code> prop and directly set the <code class=\"language-text\">color</code> to our <code class=\"language-text\">elementColor</code>. This covers the text icons, but won’t affect the emojis which are going to render in their full color. For that we need to conditionally set the <code class=\"language-text\">filter</code> to <code class=\"language-text\">grayscale(100%)</code> when the “active” color isn’t being set, which will grey out emojis, or to <code class=\"language-text\">grayscale(0%)</code> when we are setting the “active” color, but in this case we are just resetting the filter. </p>\n<p>Technically, you could go just with the <code class=\"language-text\">filter</code> approach and ditch the <code class=\"language-text\">elementColor</code>, which will work on the text based icons as well, but the shade of grey will depend on the active color, so your icons might look brighter or darker depending on which base color you chose.</p>\n<p>Additionally, we are setting our <code class=\"language-text\">fontSize</code> to an appropriate value if we passed in the <code class=\"language-text\">iconSize</code> prop. If not we are setting it to <code class=\"language-text\">14px</code> by default, which you could also separate into its own <code class=\"language-text\">DEFAULT_ICON_SIZE</code> property if you wanted to.</p>\n<p>Next step is to make these colors apply on hover and on click.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// return statement in Stars.jsx</span>\n\n<span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n  <span class=\"token operator\">&lt;</span>div\n    className<span class=\"token operator\">=</span><span class=\"token string\">\"star\"</span>\n    key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>index<span class=\"token punctuation\">}</span>\n    style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>\n      fontSize<span class=\"token operator\">:</span> iconSize <span class=\"token operator\">?</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>iconSize<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">px</span><span class=\"token template-punctuation string\">`</span></span> <span class=\"token operator\">:</span> <span class=\"token string\">\"14px\"</span><span class=\"token punctuation\">,</span>\n      color<span class=\"token operator\">:</span> elementColor<span class=\"token punctuation\">,</span>\n      filter<span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>isActiveColor <span class=\"token operator\">?</span> <span class=\"token string\">\"grayscale(0%)\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"grayscale(100%)\"</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n<span class=\"gatsby-highlight-code-line\">    onMouseEnter<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setTemporaryRating</span><span class=\"token punctuation\">(</span>index <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"gatsby-highlight-code-line\">    onMouseLeave<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setTemporaryRating</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"gatsby-highlight-code-line\">    onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">handleClick</span><span class=\"token punctuation\">(</span>index <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>  <span class=\"token operator\">></span>\n    <span class=\"token punctuation\">{</span>icon <span class=\"token operator\">?</span> icon <span class=\"token operator\">:</span> <span class=\"token constant\">DEFAULT_ICON</span><span class=\"token punctuation\">}</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>When we mouse over the icons we need to set and reset our <code class=\"language-text\">temporaryRating</code>. When we first hover it we use <code class=\"language-text\">onMouseEnter</code> to set the <code class=\"language-text\">temporaryRating</code> to <code class=\"language-text\">index + 1</code> because, as you remember, our index will always be 1 lower than the actual rating. Once we move our mouse outside of the icon we use <code class=\"language-text\">onMouseLeave</code> to set <code class=\"language-text\">temporaryRating</code> back to 0, so it doesn’t get stuck on the last hovered value. </p>\n<p>Finally, we use <code class=\"language-text\">onClick</code> to call a new function called <code class=\"language-text\">handleClick</code> which will set the final <code class=\"language-text\">rating</code> to <code class=\"language-text\">index + 1</code>. Inside of this function we will also store our final value in <code class=\"language-text\">localStorage</code> so it will persist afer refreshing the page. Here is what that function looks like.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// handleClick function in Stars.jsx</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleClick</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">rating</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setRating</span><span class=\"token punctuation\">(</span>rating<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  localStorage<span class=\"token punctuation\">.</span><span class=\"token function\">setItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"starRating\"</span><span class=\"token punctuation\">,</span> rating<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>We are doing this just for this example, to show what would be the final behavior for a single component. In production you would need to modify this to connect to your actual database where you keep the record of all of your different ratings. Otherwise, all your rating components will be set to the same value. Here is the final look of the full <code class=\"language-text\">Stars.jsx</code> file.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// Stars.jsx</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"./Stars.css\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_COUNT</span> <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_ICON</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"★\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_UNSELECTED_COLOR</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"grey\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_COLOR</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"yellow\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Stars</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> count<span class=\"token punctuation\">,</span> defaultRating<span class=\"token punctuation\">,</span> icon<span class=\"token punctuation\">,</span> color<span class=\"token punctuation\">,</span> iconSize <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>rating<span class=\"token punctuation\">,</span> setRating<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span>defaultRating<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>temporaryRating<span class=\"token punctuation\">,</span> setTemporaryRating<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">let</span> stars <span class=\"token operator\">=</span> <span class=\"token function\">Array</span><span class=\"token punctuation\">(</span>count <span class=\"token operator\">||</span> <span class=\"token constant\">DEFAULT_COUNT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">fill</span><span class=\"token punctuation\">(</span>icon <span class=\"token operator\">||</span> <span class=\"token constant\">DEFAULT_ICON</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleClick</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">rating</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setRating</span><span class=\"token punctuation\">(</span>rating<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    localStorage<span class=\"token punctuation\">.</span><span class=\"token function\">setItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"starRating\"</span><span class=\"token punctuation\">,</span> rating<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>starsContainer<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>stars<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> isActiveColor <span class=\"token operator\">=</span>\n          <span class=\"token punctuation\">(</span>rating <span class=\"token operator\">||</span> temporaryRating<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span>\n          <span class=\"token punctuation\">(</span>index <span class=\"token operator\">&lt;</span> rating <span class=\"token operator\">||</span> index <span class=\"token operator\">&lt;</span> temporaryRating<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">let</span> elementColor <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isActiveColor<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          elementColor <span class=\"token operator\">=</span> color <span class=\"token operator\">||</span> <span class=\"token constant\">DEFAULT_COLOR</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n          elementColor <span class=\"token operator\">=</span> <span class=\"token constant\">DEFAULT_UNSELECTED_COLOR</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span>\n            <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>star<span class=\"token punctuation\">\"</span></span>\n            <span class=\"token attr-name\">key</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>index<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">style</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>\n              fontSize<span class=\"token operator\">:</span> iconSize <span class=\"token operator\">?</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>iconSize<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">px</span><span class=\"token template-punctuation string\">`</span></span> <span class=\"token operator\">:</span> <span class=\"token string\">\"14px\"</span><span class=\"token punctuation\">,</span>\n              color<span class=\"token operator\">:</span> elementColor<span class=\"token punctuation\">,</span>\n              filter<span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>isActiveColor <span class=\"token operator\">?</span> <span class=\"token string\">\"grayscale(0%)\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"grayscale(100%)\"</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">onMouseEnter</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setTemporaryRating</span><span class=\"token punctuation\">(</span>index <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">onMouseLeave</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setTemporaryRating</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">handleClick</span><span class=\"token punctuation\">(</span>index <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token punctuation\">{</span>icon <span class=\"token operator\">?</span> icon <span class=\"token operator\">:</span> <span class=\"token constant\">DEFAULT_ICON</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Final thing left is to actually use our new component. In my example I will just import it to my <code class=\"language-text\">App.jsx</code> alongside a <code class=\"language-text\">localStorage</code> check to see if we already have a <code class=\"language-text\">defaultRating</code> that we need to pass in.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// App.jsx</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"./App.css\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Stars <span class=\"token keyword\">from</span> <span class=\"token string\">\"./Stars\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> defaultRating <span class=\"token operator\">=</span> localStorage<span class=\"token punctuation\">.</span><span class=\"token function\">getItem</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"starRating\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Stars</span></span> <span class=\"token attr-name\">defaultRating</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>defaultRating<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span></code></pre></div>\n<p>To test out other props and customize your new rating component you can try one of these setups, or a combination of them.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Stars</span></span> <span class=\"token attr-name\">icon</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>❤<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">color</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>red<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">defaultRating</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>defaultRating<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span> <span class=\"token comment\">// 5/5 red hearts component</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Stars</span></span> <span class=\"token attr-name\">icon</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>😍<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">defaultRating</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>defaultRating<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span> <span class=\"token comment\">// 5/5 smiley face with hearts for its eyes component</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Stars</span></span> <span class=\"token attr-name\">icon</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>🌷<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">defaultRating</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>defaultRating<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">count</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token number\">10</span><span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span> <span class=\"token comment\">// 10/10 flower component</span></code></pre></div>\n<p>And with that our (star) rating component is finished. It is light and fairly customizable, but depending on your use-case you might want to add more functionalities or customizations to it. Technically, this component will work with <code class=\"language-text\">svg</code> files and images, but you will need to take care of resizing them with CSS.  </p>\n<p>Have fun with messing around with it, and if you do end up using or even improving this component send me a message, as I would love to see and hear about your creations!</p>\n<hr>\n \n<div class=\"sectionHighlight\">If you have any questions or comments you can reach out to me on <a href=\"https://twitter.com/alekswritescode\" target=\"_blank\" rel=\"noopener noreferrer\">Twitter</a> and <a href=\"https://www.instagram.com/aleks.popovic/\" target=\"_blank\" rel=\"noopener noreferrer\">Instagram</a>, where I also post interesting code tidbits and designs.\n \nI also have a <a href=\"https://www.youtube.com/AleksPopovic\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube channel</a> where I regularly upload React and web dev tutorials, so if that's your cup of tea feel free to support me by subscribing.</div>","frontmatter":{"title":"Easy Customizable Star Rating Component in React","series":null,"seriesLink":null,"date":"November 14, 2023","description":"In this tutorial you will learn how to set up a simple, yet pretty customizable star rating component in React. You know those little stars that you use to rate stuff all over the internet? We will build those as a default use-case, but we will also add support for other text-based and emoji-based icons that you can use instead of little yellow stars.","tags":["web","react","component"],"featuredImage":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAABuUlEQVQY02WRz08TURDH9+BBsxVp+RHeM2V3+36/160bSrddWxZMaVlLobRxoyhqNW0TbJpIUuLF+IsbNw/CjZMxHoz/AAn4p/mKxoszc5lJZuYz3zEYpTo4Iew/s4TY66c3m873b4nNRn5jo5nNKs/zEEJUdzFmENclSmX8IpWK6QrnbOIMcb6XXtyetyeTPSxLxSAMIz2g0Yjq9SAIMMZGYnSQfNGf6fZQLiccR2QcTSEYg1J8Sc1cTiXOp25+Ts0OAAwsS69JKxVUq/mlJUKIAaLGXPwIbrcXw1V7JYRbOyi/zCjRXHmOLcy6c3AMwC/T/JFMXpjmm4WFGEL8BzuxP7r1cnDj9dgc7F8fHVx7+wl0HiAb3b/Lf75yu2XcjSSiRApahnAAwNfp6bNUyuL6PGZglcVKah4kpFsoOJTOA2Dbjp+TtRJ7HKGjXXbyVLxr8fVWLIMSE4JwTq8UNbgWhFJ9pGNZ7VbrYRx/fP8hrN3r17Z2w2b7TtVj3lqRlpfp814v7nTGh4dKqb9q/3uMzl3XHQ6Hpyen1dq6Vb5N/MyTZ/U1v3C8M6y4fpQtcilWKpUr5In9BjxtZoi/jzecAAAAAElFTkSuQmCC","aspectRatio":2.6666666666666665,"src":"/static/3fcc896f07936890607bd46ef93a75e1/0e6e2/rating.png","srcSet":"/static/3fcc896f07936890607bd46ef93a75e1/b460a/rating.png 480w,\n/static/3fcc896f07936890607bd46ef93a75e1/6e898/rating.png 960w,\n/static/3fcc896f07936890607bd46ef93a75e1/0e6e2/rating.png 1920w","srcWebp":"/static/3fcc896f07936890607bd46ef93a75e1/30cf3/rating.webp","srcSetWebp":"/static/3fcc896f07936890607bd46ef93a75e1/35871/rating.webp 480w,\n/static/3fcc896f07936890607bd46ef93a75e1/fcc10/rating.webp 960w,\n/static/3fcc896f07936890607bd46ef93a75e1/30cf3/rating.webp 1920w","sizes":"(max-width: 1920px) 100vw, 1920px"}}}}}},"pageContext":{"slug":"/Easy-Customizable-Star-Rating-Component-in-React/","previous":{"excerpt":"If you need a quick and simple solution for address search with autocomplete and geocoding this one is for you. To set up this project you…","fields":{"slug":"/Address-Search-With-React-and-Mapbox-API/"},"frontmatter":{"date":"November 09, 2023","title":"Address Search with React and Mapbox API","series":null,"description":"If you need a quick and simple solution for address search with autocomplete and geocoding this one is for you.","tags":["web","react","API"],"featuredImage":{"id":"ef200b89-aee2-5b99-81a2-7b8b0749b57b","publicURL":"/static/03b6810fd10b370c8aca9660ed18d330/address.png","relativeDirectory":"Address-Search-With-React-and-Mapbox-API","relativePath":"Address-Search-With-React-and-Mapbox-API/address.png"}}},"next":{"excerpt":"I grew up on both DC and Marvel comic books, cartoons and TV shows. From the 1966 Batman series, to 1967 Spider man cartoons, and 1940s…","fields":{"slug":"/Comic-Book-App-With-Marvel-API-and-React/"},"frontmatter":{"date":"November 02, 2023","title":"Comic Book App With Marvel API and React","series":null,"description":"I grew up on both DC and Marvel comic books, cartoons and TV shows. From the 1966 Batman series, to 1967 Spider man cartoons, and 1940s Superman cartoons. Which is sort of ridiculous since I grew up in the 90s, but I guess that's what our TV companies could afford at the time.","tags":["web","react","API"],"featuredImage":{"id":"4bc9cdf5-bdec-5969-b277-f3d1db641a0d","publicURL":"/static/9dc0ca21ac4035a31d6c67333000d87c/marvel.png","relativeDirectory":"Comic-Book-App-With-Marvel-API-and-React","relativePath":"Comic-Book-App-With-Marvel-API-and-React/marvel.png"}}}}}}